/**
 * @file gestiondefichier.c
 * @author Florian Castellane <florian.castellane@grenoble-inp.org>
 * @author Christian Proust <christian.proust@phelma.grenoble-inp.fr>
 * @date Tue Sep 25 01:04:00 2012
 * @brief Fonctions de gestion de fichiers.
 *
 */


#include <stdlib.h>
#include <stdio.h>
#include "include/gestiondefichier.h"
#include "include/analyser.h"
#include "include/gestiondetypes.h"

FILE * ouvrir_fichier(const char * nom_de_fichier, const char* mode)
{
    FILE * fichier=NULL;

    /// PARTIE 1 : on ouvre le fichier
    fichier = fopen(nom_de_fichier,mode);

    /// Partie 2 : on verifie que l'ouverture s'est bien deroule
    if(fichier==NULL)
    {
        perror("Erreur d\'ouverture de fichier");
        exit(EXIT_FAILURE);
    }

    return fichier;
}



LISTE recuperer_texte (char *nom_fichier_source)
{
    int nb_lignes_lues=0;


    /////////////////////////////////////////////////
    // INITIALISATION                              //
    /////////////////////////////////////////////////
    char une_ligne_du_fichier[TAILLE_MAX_LIGNE*3+1];
    LISTE liste_de_lexemes=creer_liste();              // crée une liste vide (NULL)
    FILE *fichier_a_lire=ouvrir_fichier(nom_fichier_source,"r+");
    verif_taille_fichier(fichier_a_lire,TAILLE_MAX_LIGNE);
    /////////////////////////////////////////////////

    while( fgets(une_ligne_du_fichier,TAILLE_MAX_LIGNE,fichier_a_lire)!=NULL )  // ligne par ligne jusqu'à la fin du fichier
    {
        ///printf("%d\t%s",i,une_ligne_du_fichier);    // debug
        canoniser_ligne(une_ligne_du_fichier);
        puts(une_ligne_du_fichier);
        ///printf("%d\t%s",i,une_ligne_du_fichier);    // debug
        nb_lignes_lues++;
        liste_de_lexemes = decoupe_ligne_lexeme(une_ligne_du_fichier,liste_de_lexemes);
    }
    printf("\n%d ligne(s) du fichier a (ont) ete lue(s).\n",nb_lignes_lues);

    liste_de_lexemes = classifie_liste_lexeme(liste_de_lexemes);
    /*
        LISTE liste_index=liste_de_lexemes;
        for (liste_index=liste_de_lexemes; !est_vide(liste_index); liste_index=liste_index->suivant)
        {
            printf("%s\t%s\n",traduire_type_lexeme(liste_index->element.type_de_lexeme), liste_index->element.chaine_lexeme);
        }
    */
    fclose(fichier_a_lire);
    return liste_de_lexemes;
}

void verif_taille_fichier(FILE *fichier, int taille_max_ligne)
{

    int i, Max;// La taille max d'une ligne de fichier doit etre inferieure a
    //ce qu'un int peut compter
    char lettre=0;


    /// PARTIE 1 : On cherche le nombre de caracteres max par ligne du fichier
    Max = i = 0; //Max est le nombre de charactere max et i le nombre lu

    while(fscanf(fichier,"%c",&lettre)!=EOF)
    {
        if (lettre =='\n')
        {
            if(i>Max) Max=i;
            i=0;
        }
        else
        {
            i++;
        }
    }

    ///PARTIE 2 : on s'assure que le nombre de caractere est inferieur au seuil

    if(taille_max_ligne < Max)
    {
        puts("Erreur : nombre caractere par ligne du fichier trop grand");
        exit(EXIT_FAILURE);
    }

	///Partie 3 : on verifie qu'il y a bien un \n en fin de ligne
	if(lettre != '\n') 
	{
		fseek(fichier,0,SEEK_END);
		i=fprintf(fichier,"\n");
		if(i!=1) // Verifie qu'on peut bien ecrire dans le fichier
		{
			perror("Erreur de programation : fonction verif_taille_fichier");
        		exit(EXIT_FAILURE);
        	}
	}
	
    fseek(fichier,0,SEEK_SET);//on retourne le curseur au debut pour le reste du programme
    return ;
}
